package com.wtgroup.demo.foo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class BestSubsequence {
    static final int MOD = 1000000007;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        int Q = Integer.parseInt(input[2]);

        int[] bit = new int[N];
        for (int i = 0; i < M; i++) {
            input = br.readLine().split(" ");
            int l = Integer.parseInt(input[0]);
            int r = Integer.parseInt(input[1]);
            update(bit, l - 1, r - 1);
        }

        for (int i = 0; i < Q; i++) {
            input = br.readLine().split(" ");
            int l = Integer.parseInt(input[0]);
            int r = Integer.parseInt(input[1]);
            int k = Integer.parseInt(input[2]);
            System.out.println(query(bit, l - 1, r - 1, k));
        }
    }

    // static void update(int[] bit, int l, int r) {
    //     update(bit, l, 1);
    //     update(bit, r + 1, -1);
    // }

    // static void update(int[] bit, int index, int value) {
    //     while (index < bit.length) {
    //         bit[index] += value;
    //         index += index & -index;
    //     }
    // }

    // 0 1 反转
    static void update(int[] bit, int l, int r) {
        // 1->0 或 0->1
        for (int i = l; i <= r; i++) {
            bit[i] = bit[i] == 0 ? 1 : 0;
        }
    }

    // 取最大序列
    static void maxSub(int[] bit, int l, int r, int k, List<Integer> result) {
        if (k <= 0) {
            return;
        }
        int subLen = r - l + 1;
        if (subLen <= k) {
            // 只有一个选择
            // 返回头
            // result.add(bit[l]);
            for (int i = l; i <= r; i++) {
                result.add(bit[i]);
            }
            return;
        }
        // 可选择元素中选取所有的1
        int i = l;
        int maxi = l + subLen - k;
        for (; i <= maxi; i++) {
            if (k > 0 && bit[i] == 1) {
                result.add(bit[i]);
                k = k -1;
                // break;
            }
        }
        // i~r 递归去
        maxSub(bit, i, r, k, result);
    }

    // 查询
    static long query(int[] bit, int l, int r, int k) {
        List<Integer> maxSubSeq = new ArrayList<>();
        // 得到最大子序列
        maxSub(bit, l, r, k, maxSubSeq);

        long result = 0;
        for (int i = 0; i < maxSubSeq.size(); i++) {
            Integer v = maxSubSeq.get(i);
            // 如 1*2^3
            result += v * (1 << (maxSubSeq.size() - i - 1));
        }

        return result % MOD;
    }


    // static long query(int[] bit, int l, int r, int k) {
    //     int[] count = new int[2];
    //     for (int i = l; i <= r; i++) {
    //         count[(bit[i] & 1) == 1 ? 1 : 0]++;
    //     }
    //     long result = 0;
    //     for (int i = 0; i < k; i++) {
    //         if (count[1] > 0) {
    //             result = (result * 2 + 1) % MOD;
    //             count[1]--;
    //         } else {
    //             result = (result * 2) % MOD;
    //             count[0]--;
    //         }
    //     }
    //     return result;
    // }
}
